package com.showmaker.service.impl;

import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.showmaker.bean.CheckItem;
import com.showmaker.entity.PageResult;
import com.showmaker.entity.QueryPageBean;
import com.showmaker.entity.Result;
import com.showmaker.mapper.CheckItemMapper;
import com.showmaker.service.CheckItemService;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Transactional
@DubboService(interfaceClass = CheckItemService.class, version = "1.0")
public class CheckItemServiceImpl implements CheckItemService {

    @Autowired
    private CheckItemMapper checkItemMapper;

    @Override
    public void add(CheckItem checkItem) {
        checkItemMapper.add(checkItem);
    }

    @Override
    public PageResult pageQuery(QueryPageBean queryPageBean) {
        // 1.从前端参数中获取当前页码、当前页条数、查询条件
        Integer currentPage = queryPageBean.getCurrentPage();
        Integer pageSize = queryPageBean.getPageSize();
        String queryString = queryPageBean.getQueryString();

        // 2.如果是要根据关键字进行查询，那么需要将页码改为第1页。因为如果使用前端传过来的页码
        // currentPage 可能等于5，那么就相当于 按条件模糊查询得到一个集合，并从该集合的第50条
        // 数据开始获取，这样往往是得不到数据的，所以这里将 currentPage 的值修改为 1
        if (queryString != null) {
            currentPage = 1;
        }

        // 3.基于MyBatis框架的分页助手插件完成分页查询（分页插件基于本地线程）
        // 只需要配置这个语句，在底层Mybatis会自动在查询语句中添加上 limit 关键字
        PageHelper.startPage(currentPage, pageSize);

        // 4.调用 mapper 方法查询数据，MyBatis会将数据封装好放入到Page对象里面
        Page<CheckItem> checkItems = checkItemMapper.pageQuery(queryString);

        // 5.从 Page 对象中可以获取查询的结果
        long total = checkItems.getTotal();
        List<CheckItem> result = checkItems.getResult();

        // 6.将查询的结果封装成一个 PageResult 对象，并返回
        return new PageResult(total, result);
    }

    @Override
    public void deleteById(int id) {
        // 判断当前检查项是否已经关联到检查组，如果当前检查项
        // 已经被关联到检查组，那么当前检查项也是不能被删除的
        int count = checkItemMapper.findCountByCheckItemId(id);
        if (count > 0) {
            // 若当前检查项已经关联到检查组，则抛出异常
            throw new RuntimeException();
        }
        // 如果检查项没有关联到检查组，则直接进行删除
        checkItemMapper.deleteById(id);
    }

    @Override
    public CheckItem findById(int id) {
        return checkItemMapper.findById(id);
    }

    @Override
    public void editItem(CheckItem checkItem) {
        checkItemMapper.editItem(checkItem);
    }

    @Override
    public List<CheckItem> queryAll() {
        return checkItemMapper.queryAll();
    }
}
